iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0

! 本篇文章將會介紹 第三週回顧:Agent 已經會自己發文了,期望大家都能看懂一雙「網頁的手」怎麼從安裝練到無人值守發文 :D

W1 我們把 agent 訓練成會寫文章的員工,W2 給它排班表、哨子與防護網,W3 則補上最後一塊拼圖:一雙真的能操作網頁的手。六天從 agent-browser 安裝、persistent profile 登入、填表、截圖驗收,一路打到 iT 邦幫忙發文實戰上下集。今天照慣例盤點:攤開 W3 的拼圖地圖、用 logs/ 的真實數字交成績單,外加本週唯一一場事故屍檢——20:00 那一發死於家裡斷網。先講結論:20 天零斷更,W3 六天六發全部上架,人工介入只有一次,而且事後對錶發現,補發保險其實早就就位,人只是搶快了 72 秒。

本篇目標

讀完這篇你會學到:

  • W3 六塊拼圖(入門 → profile → 填表 → 截圖 → 實戰上下集)如何把「發文」從人類手感變成排程任務
  • 用 logs/ 與 state/ 的實際紀錄檢視 W3 成績:生成耗時、發佈秒數、零重試零隔離的生成端表現
  • d17 斷網事故的完整屍檢:FATAL 為什麼是正確的死法、72 秒之差的人機競賽

環境準備

  • 一台 macOS,加上 W2 裝好的三班制排程(19:00 / 20:00 / 20:15)
  • d16 綁定的 iThelp 登入 profile,位置記在 config.sh 的 BROWSER_PROFILE
# 進到系列 repo
cd /Users/benben/ai/automations/ironman

# W3 的發文成績單:最後六行就是 d15–d20
tail -6 state/published.log

# 每天一張的發佈存證截圖
ls screenshots/ | grep publish-d

主要內容

步驟一:W3 六塊拼圖——從裝上手到手感爐火純青

先把這週六篇文章收攏成一張地圖:

  • d15 agent-browser 入門:open / click / fill / snapshot 四個核心操作,讓 agent 摸得到網頁
  • d16 Persistent profile:登入一次永久保存,之後所有操作都站在「已登入」的起跑線上
  • d17 網頁填表實戰:selector、snapshot ref、等待策略,穩定填表三件套
  • d18 截圖驗證:每一步存證,讓自動化作業可稽核、可除錯
  • d19 發文實戰(上):偵察兵日——拆解 iThelp 編輯器的 article_type 陷阱、CodeMirror 真身、select2 遊戲規則
  • d20 發文實戰(下):組裝日——把零件全部裝進 publish.sh,MODE 分流 + 輪詢 URL 判成敗

這六塊拼起來,就是 publish.sh 現在的樣子:launchd 20:00 叫醒它,它開著真 Chrome、帶著 profile 與反偵測三件套走進發文頁,填表、驗證、點擊、輪詢 URL、截圖、touch flag、跟 Discord 回報——整條路沒有人類參與。這個系列本身就是這套系統發的,你現在讀到的每一篇都是它的實績。

步驟二:W3 成績單——生成端安穩到有點無聊

數字全部出自 logs/generate-*.log 與 state/published.log,沒有一個是編的:

天 生成耗時 嘗試 字數
15 4 分 38 秒 1 1,587
16 6 分 56 秒 1 1,686
17 5 分 44 秒 1 1,505
18 3 分 52 秒 1 1,524
19 4 分 40 秒 1 1,691
20 6 分 13 秒 1 1,743

六天全部第一次嘗試就過關,合計 32 分 03 秒、平均 5 分 20 秒一篇;字數穩定落在 1,505–1,743;state/ 裡的 quarantine-* 隔離檔停格在 d09,W3 一件都沒有。對照 W2 那場五連殺事故,生成端已經從「需要保鑣看著」進化到「自律上班」。

發文端更有感。點下「發表文章」到 URL 確認成功,六次實測全落在 6–8 秒;整個 job 從 launchd 觸發到 flag 落地,多數日子 30 秒內收工。d19 的 log 節錄:

# 從點擊到確認成功只花 6 秒(publish-20260929.log 節錄)
[2026-09-29 20:00:19] 點擊發佈(第 1/3 次)
[2026-09-29 20:00:25] 發佈成功:https://ithelp.ithome.com.tw/articles/10418879

六篇文章依序上架在 10417031 到 10419308,screenshots/ 裡 publish-d15 到 publish-d20 一天一張、全部對得起來。

小小小測驗:你知道 W3 這六天發文,Cloudflare Turnstile 人機驗證實際跳出來幾次嗎?
答案:零次。六天的 log 都寫著「頁面無 Turnstile 元件,跳過 token 等待」。但 D1 開賽那天它真的出現過(screenshots/ 還留著 turnstile-timeout 存證),所以程式裡那段條件式等待一個字都不能刪——防禦性程式碼的價值,本來就不是靠天天出勤證明的。

步驟三:d17 斷網事故屍檢——FATAL 是正確的死法

週日 20:00,publish.sh 準時起床,卻在開發文頁那一步直接斷氣:

# publish-20260927.log 節錄:家裡網路正好在那幾分鐘斷線
[2026-09-27 20:00:18] d17 發文來源:/Users/benben/ai/automations/ironman/articles/2026-09-27-d17.md
✗ Navigation failed: net::ERR_INTERNET_DISCONNECTED
[2026-09-27 20:00:27] FATAL: 無法開啟發文頁(profile 可能未登入,見 CALIBRATION.md)

這個 FATAL 死得很健康:沒有半填的表單、沒有誤觸的按鈕,Discord 當場收到 error 告警。20:13 網路恢復,我手動重跑一發過關;20:15:05 補發 job 準時醒來,看到 flag 已存在,安靜退場。有意思的是時間差:我 20:13:53 按下重跑,補發 job 20:15:05 才起床——人只快了 72 秒。就算我睡死,保險也會在兩分鐘後自動理賠。W2 埋的 republish 保險第一次「幾乎」實戰:它可以沒派上用場,但不能不存在。

順帶解答 d20 為什麼慢:20:00 是全台鐵人賽作者的發文尖峰,光開草稿頁與驗證就從 20:00:05 磨到 20:01:52。腳本的等待策略把這些延遲全部吸收,沒有任何一步誤判逾時——慢不是故障,把「慢」誤判成「死」才是。

步驟四:系統現況——接下來只剩整合與煞車

# 每天一枚的發佈勳章:目前 19 枚,今晚 20:15 後變 20
ls state/ | grep published- | wc -l
# 19

一句話總結現況:生成、發文、補發、告警已全部無人值守,人只剩兩個工作——維護 outline.md 這份事實來源,以及偶爾在斷網時當一次 72 秒的英雄。 但誠實盤點,系統還有三筆欠帳:生成與發文目前是兩個獨立 job 靠檔案系統交接,稱不上正式的管線;備援只有單層,沒有重試鏈;而且沒有任何煞車機制,萬一腳本想發佈不該發佈的東西,只能靠機敏掃描與人工喊卡。這三件事正是 W4 的全部:管線整合、備援設計、進度追蹤、日誌稽核、異常自癒、安全煞車——把「能跑」煉成「敢睡」。

常見問題 / 踩坑記錄

  • Q:publish.sh 開頁就 net::ERR_INTERNET_DISCONNECTED 直接 FATAL,為什麼不在腳本裡加網路重試?
    A:d17 的實錄。開頁失敗屬於環境級故障,腳本內建重試是 5 秒級的,遇到半小時的斷網照樣全滅;設計上交給 20:15 的 republish job 做「15 分鐘後再試一次」,兩層時間尺度各管各的。腳本要做的只是乾淨地死、大聲地告警,把恢復交給排程。
  • Q:20:00 前後發文特別慢,要不要把逾時調短逼它快一點?
    A:反了。d20 草稿頁驗證花了 1 分 47 秒,那是 iThelp 尖峰時段的伺服器常態。等待要設計成「輪詢直到特徵出現」,而不是「固定秒數後放棄」;把逾時調短只會把慢誤判成死,反而製造事故。
  • Q:Turnstile 六天都沒出現,那段等待程式碼可以刪了嗎?
    A:不行。D1 它出現過而且 token 等不到,turnstile-timeout 截圖還在 screenshots/。條件式檢查的成本只是一次 DOM 查詢,刪掉的風險卻是某天深夜發文被靜默卡死。低成本的防禦,留著。

小結

  • W3 六塊拼圖把 agent-browser 從「會開網頁」練到「會發鐵人賽文」,publish.sh 成為整個系統第一個真正摸到外部世界的環節
  • W3 成績:生成六發全中、零重試、零隔離,平均 5 分 20 秒一篇;發文六發上架,點擊到確認 6–8 秒
  • d17 斷網事故證明兩件事:FATAL + 告警是正確的死法;republish 保險就算被人類搶了頭香,依然是系統的底氣
  • 下一週主題只有一個字:穩。整合、備援、稽核、煞車,全都不炫砲但全都是命

明日預告

下一篇我們要介紹「全管線整合:19:00 生成 → 20:00 發文」,把 generate.sh 與 publish.sh 從「兩個剛好排在一起的 job」升級成有狀態檔交接的一條龍管線,W4 正式開張,敬請期待!

參考資料:

有任何疑問但沒有 iT 邦幫忙帳號,或是想匿名提問?
歡迎到 https://dev.benben.me/q/Z5442T 提問或加油打氣,沒意外的話會在完賽之後一起回答 :D


上一篇
20 iT 邦幫忙發文實戰(下):一鍵全自動發文
系列文
自我耍廢組:全自動化の鐵人 共 21 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言